"""模板引擎核心模块

该模块提供基于模板的代码生成功能：
1. 支持从元数据(meta)和模板文件生成代码
2. 处理命名规则转换
3. 处理Java类型推导"""

from pathlib import Path
import json
from jinja2 import Environment, Template, FileSystemLoader
from typing import Dict, Any, Optional
from src.core.common.derived import derive


def generate(
    template_file_path: str,
    target_abs_path: str,
    meta_content: Optional[Dict[str, Any]] = None,
    meta_file_path: Optional[str] = None
) -> None:
    """根据元数据和模板生成文件

    Args:
        template_file_path: 模板文件路径
        target_abs_path: 目标文件绝对路径
        meta_content: 元数据内容(已经处理过derived配置)，如果为None则从meta_file_path读取
        meta_file_path: meta.json文件路径，当meta_content为None时使用

    Raises:
        ValueError: 当meta_content和meta_file_path都为None时
    """
    # 1. 获取meta内容
    if meta_content is None:
        if meta_file_path is None:
            raise ValueError("meta_content和meta_file_path不能同时为None")

        # 从文件读取并处理
        with open(meta_file_path, 'r', encoding='utf-8') as f:
            meta_content = json.load(f)
        meta_content = derive(meta_content)

    # 2. 设置模板加载器
    template_path = Path(template_file_path)
    template_dir = template_path.parent
    template_name = template_path.name

    # 创建Environment时配置FileSystemLoader
    env = Environment(loader=FileSystemLoader(str(template_dir)))

    # 3. 渲染模板
    template = env.get_template(template_name)
    generated_content = template.render(**meta_content)

    # 4. 保存文件
    target_path = Path(target_abs_path)
    target_path.parent.mkdir(parents=True, exist_ok=True)

    with open(target_path, 'w', encoding='utf-8') as f:
        f.write(generated_content)